package com.lazily.list_;


/**
 * @Author:  GZQ
 * @date:  2025/4/26 21:44
 * @description: LinkedList 底层结构 ---- 双向链表模拟
 * @version: 1.0
 */

public class LinkedList01 {
	// 程序入口
	@SuppressWarnings({"all"})
	public static void main(String[] args) {
		// 模拟一个简单的双向链表

		Node jack = new Node("jack");
		Node jane = new Node("jane");
		Node john = new Node("john");

		// 连接三个结点, 形成双向链表
		// jack -> jane -> john
		jack.next = jane;
		jane.next = john;
		// john -> jane -> jack
		john.pre = jane;
		jane.pre = jack;

		Node first = jack; // 让first引用指向jack, 就是双向链表的头结点
		Node last = john; // 让first引用指向john, 就是双向链表的尾结点

		// 演示, 从头到尾进行遍历
		System.out.println("=====从头到尾进行遍历======");
		while (true) {
			if (first == null) {
				break;
			}
			// 输出first
			System.out.println(first);
			first = first.next;
		}

		// 演示, 从尾到头进行遍历
		System.out.println("=====从尾到头进行遍历======");
		while(true) {
			if (last == null) {
				break;
			}
			// 输出last 信息
			System.out.println(last);
			last = last.pre;
		}

		// 演示链表添加对象/数据的便利
		// 要求, 在jane 和 john 之间, 插入一个对象, lazily

		// 1. 先创建一个 Node 结点, name 就是 lazily
		Node lazily = new Node("lazily");
		// 下面就把, smith 加入到双向链表了
		lazily.next = john;
		lazily.pre = jane;
		john.pre = lazily;
		jane.next = lazily;

		// 让first 再次指向jack
		first = jack; // 让first引用指向jack, 就是双向链表的头结点

		System.out.println("=====从头到尾进行遍历======");
		while (true) {
			if (first == null) {
				break;
			}
			// 输出first
			System.out.println(first);
			first = first.next;
		}

		last = john; // 让 last 重新指向最后一个结点

		// 演示, 从尾到头进行遍历
		System.out.println("=====从尾到头进行遍历======");
		while(true) {
			if (last == null) {
				break;
			}
			// 输出last 信息
			System.out.println(last);
			last = last.pre;
		}

	}
}


/**
 * 定义一个Node 类, Node 对象 表示双向链表的一个结点
 */

class Node {
	public Object item; // 真正存放数据
	public Node next; // 指向后一个结点
	public Node pre; // 指向前一个结点
	public Node(Object name) {
		this.item = name;
	}

	@Override
	public String toString() {
		return "Node name=" + item;
	}
}